package com.ce.pms.house.service;

import java.util.List;
import java.util.Map;

import com.ce.pms.common.model.SysrefcodeDO;
import com.ce.pms.customer.vo.CustomerHouseVO;
import com.ce.pms.house.model.CoalitionHouseDomain;
import com.ce.pms.house.model.HouseDomain;
import com.ce.pms.house.model.HousePlan;
import com.ce.pms.house.vo.FlatVO;
import com.ce.pms.house.vo.HouseSearchVO;
import com.ce.pms.house.vo.HouseStatusVO;
import com.ce.pms.house.vo.HouseVO;
import com.ce.pms.house.vo.ImageVO;
import com.ce.pms.house.vo.PrecinctVO;
import com.sitechasia.webx.core.support.Page;

public interface IHouseService extends IProductService{
	/**
	 *
	 * 功能描述: 添加一个房屋信息(住宅)
	 *
	 * @author 付湘辉
	 * Created on:2008-7-1
	 *
	 * 修改原因：
	 * @param flatvo
	 * @return FlatVO 返回结果
	 */
	public FlatVO addHouse(FlatVO flatvo);

	/**
	 * 功能描述: 检查指定房号的房间是否是单独的产权房间 <br>
	 * @param houseNumber
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-8-21  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean checkHouseIsLonely(String houseNumber);

	/**
	 * 功能描述: 检查指定的房屋是否可以修改其状态。
	 * <ul><li>只有自住，空置，出租这三种状的房屋才能修改状态。</li></ul>
	 * @param houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-29  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean checkHouseStatusCanbeModified(Long houseId);

    /**
	 * 功能描述: 检查指定的房间是否在同一个楼栋中。
	 * houseIdString是一个房间id的拼接字符串，使用SQL语句查询这些房间所在的楼栋的数量，如果数量不为1,则返回false <br>
	 * @param houseIdString
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-31  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean checkHouseWhetherWithinSameBuilding(String houseIdString);

	/**
     * 功能描述: 对房号的唯一性进行检查，这种检查同时包括产权房和管理房。规则如下：
     * <ol>
     * <li>在同一建设期下不允许有相同的房屋号码。</li>
     * <li>参数projectId和houseId分别代表期数id和房屋id，它们可能为空值。</li>
     * <li>如果houseId不为空，一般用于验证修改房屋时查找不是这个id的房屋是否存在相同的房号houseNumber。</li>
     * </ol>
     *
     * @param projectId   建设期id
     * @param houseId   房屋id
     * @param houseNumber  房屋号码
     * @return boolean true:存在 false:不存在
     * @author：付湘辉
     *         <ul>
     *         <li>Create on:2008-7-2 </li>
     *         </ul>
     * @author：
     *          <ul>
     *          <li>Edit on: </li>
     *          <li>Why: </li>
     *          </ul>
     */
	public boolean checkIsOnlyHouseNoInHouseAndCoalitionHouse(Long projectId,Long houseId,String houseNumber);

    /**
	 *
	 * 功能描述: 检查同一个楼盘期数下的指定的房号在产权房和管理房中是否都不存在
	 *
	 * @author 付湘辉
	 * Created on:2008-7-1
	 *
	 * 修改原因：
	 *
	 * @param projectId
	 * @param houseNumber
	 *
	 * @return boolean 返回结果
	 */
	public boolean checkIsOnlyHouseNoInHouseAndCoalitionHouse(Long projectId,String houseNumber);

    /**
	 *
	 * 功能描述: 检查指定的房号在产权房和管理房中是否都不存在
	 *
	 * @author 付湘辉
	 * Created on:2008-7-1
	 *
	 * 修改原因：
	 * @param houseNumber
	 * @return boolean 返回结果
	 */
	public boolean checkIsOnlyHouseNoInHouseAndCoalitionHouse(String houseNumber);


	/**
	 * 功能描述: 删除一个房间 imageList是一个从调用方传入的列表，它必须是已初始化的，<br>
	 * 当这个房间有图片时，将放入这个列表，由调用者删除图片文件<br>
	 * @param houseId
	 * @param imageList
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-21  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public void deleteHouse(Long houseId,List<ImageVO> imageList);

	/**
	 *
	 * 功能描述: 修改一个房屋信息(住宅)
	 *
	 * @author 付湘辉
	 * Created on:2008-7-1
	 *
	 * 修改原因：
	 * @param flatvo
	 * @return FlatVO 返回结果
	 */
	public FlatVO editHouse(FlatVO flatvo);

	/**
    *
    * 功能描述:  获取指定产权房id的管理房实体 <br>
    *
    * @param houseDomain
    * @return
    *
    * Create author：付湘辉  <br>
    * Create on:2008-7-25  <br>
    * Edit author：  <br>
    * Edit on:    <br>
    * Why:     <br>
    */
   public CoalitionHouseDomain getCoalition(Long houseId);

	/**
	 *
	 * 功能描述: 根据房屋id查询房屋信息，使用HouseVO对象封装内容,<br>
	 * 此方法返回的是一个住宅房的详细信息,如果调用要得到一个FlatVO，可以使用强制转换操作。
	 *
	 * @author 付湘辉
	 * Created on:2008-7-4
	 *
	 * 修改原因：
	 * @param houseId　房屋id
	 * @return HouseVO 返回结果
	 */
	public HouseVO getFlatHouseById(Long houseId);

    /**
	 * 功能描述:查询指定的普通住宅<br>
	 * @param keyword
	 * @return<br>
	 * Create author:罗军林<br>
	 * Create on:2009-1-8<br>
	 * Edit author:<br>
	 * Edit on:<br>
	 * Why:<br>
	 */
	public FlatVO getFlatHouseVO(Long keyword);

    /**
	 * Function:根据房间号码查询房间的do
	 * @param
	 * @return
	 * Create author:xuhaidui
	 * Create on:2008-6-10
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
    public List<CustomerHouseVO> getHouseAndCustomerBy(String houseNumber);

    /**
	 * 功能描述:  <br>
	 * @param houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2009-1-4  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public HouseDomain getHouseById(Long houseId);

    /**
    *
    * 功能描述: 根据期数和产权房号得到一个产权房实体
    *
    * @author 付湘辉
    * Created on:2008-7-10
    *
    * 修改原因：
    * @param houseNumber
    * @return HouseDomain 返回结果
    */
	public HouseDomain getHouseByNumber(Long projectId,String houseNumber);

	/**
     *
     * 功能描述: 根据产权房号得到一个产权房实体
     *
     * @author 付湘辉
     * Created on:2008-7-10
     *
     * 修改原因：
     * @param houseNumber
     * @return HouseDomain 返回结果
     */
    public HouseDomain getHouseByNumber(String houseNumber);

	/**
	 * 功能描述: 根据产权房号得到一个产权房实体,
     * virtual是一个开关标志，为true则查询包括管理房 <br>
	 * @param houseNumber
	 * @param virtual 是否查询管理房　true：是　false：否
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-8-15  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public HouseDomain getHouseByNumber(String houseNumber,boolean virtual);

	/**
	 * 功能描述: 根据房号得到这间房所在产权共有的管理房下所有产权房信息，包括它本身 <br>
	 * 1：调用房屋接口得到此房号对应的房屋信息 <br>
	 * 2：利用HouseDomain 实体关系得到基产权共有的管理房信息，没有则返加只包含它自己的列表 <br>
	 * 3：得到此管理房下的所有产权房屋信息 <br>
	 * @param houseNumber
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-9  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public List<HouseDomain> getHouseDomainList(String houseNumber);

	/**
	 *
	 * 功能描述: 查询所有户型列表
	 *
	 * @author 付湘辉
	 * Created on:2008-6-30
	 *
	 * 修改原因：
	 * @return List<HousePlan> 返回结果
	 */
	public List<HousePlan> getHouseModels();

	/**
	   *
	   * 功能描述:  根据户型ID获取到房屋户型 <br>
	   *
	   * @param planId
	   * @return HouseTypeVO
	   *
	   * Create author：李昊龙  <br>
	   * Create on:2008-10-14  <br>
	   * Edit author：  <br>
	   * Edit on:    <br>
	   * Why:     <br>
	   */
	   public HousePlan getHousePlanByPlanId(Long planId);

	/**
	 *
	 * 功能描述: 查询所有房间状态列表
	 *
	 * @author 付湘辉
	 * Created on:2008-6-30
	 *
	 * 修改原因：
	 * @return List<SysrefcodeDO> 返回结果
	 */
	public List<SysrefcodeDO> getHouseStatuses();
	
	/**
	 * 功能描述: 查询房间状态列表,根codeString有选择的查询状态 <br>
	 * @param codeString
	 * @return List<SysrefcodeDO>
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-25  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public List<SysrefcodeDO> getHouseStatuses(String codeString);
	
	public String getOwnerNameBy(String houseNumber);
	
	/**
	 * 功能描述: 根据房屋id查找所属管理区，在得到的结果VO中只包括管理区ID和编号字段 <br>
	 * @param houseId 房屋id
	 * @param isVirtual 是否是管理房，可为空；1管理房，0产权房
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-9-17  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public PrecinctVO getPrecinctVOByHouseId(Long houseId,String isVirtual);
	
	/**
	 * 功能描述: 修改房间状态 <br>
	 * @param houseId
	 * @param houseStatusId
	 * @return HouseVO
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-21  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public HouseVO modifyHouseStatus(Long houseId,Long houseStatusId);

	/**
	 * 功能描述: 通知完成房间装修,
	 * 调用notifyHouseRenovationOutAction后,如果房间状态未入住将房间状态改为自住.  <br>
	 * @param houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2009-1-13  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean notifyFinishRenovation(Long houseId);
	
	/**
	 * 功能描述: 通知修改房间装修状态为装修中  <br>
	 * @param houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2009-1-13  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean notifyHouseRenovationInAction(Long houseId);

	/**
	 * 功能描述: 通知修改房间装修状态为空  <br>
	 * @param houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2009-1-13  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean notifyHouseRenovationOutAction(Long houseId);

	/**
	 * 功能描述:入伙中物品移交,移交钥匙状态为"是"时调用
	 * 通知房间状态修改为:
	 * <ol>
	 * <li>如果房屋为毛坯房，房屋状态改为"未入住",HM_HOUSE_HOUSE_STATUS = 002</li>
	 * <li>如果房屋为精装修，房屋状态改为"自住", HM_HOUSE_HOUSE_STATUS = 004</li>
	 * </ol>
	 * @param houseIds
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2009-1-13  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean notifyHouseStateFinishOccupation(List<Long> houseIds);

	/**
	 * 功能描述:	通知将房间状态修改为入伙中,HM_HOUSE_HOUSE_STATUS = 003
     * 入伙中物品移交,移交钥匙状态为"否"时调用.<br>
	 * @param houseIds 待修改的产权房id列表
	 * @return Boolean
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2009-1-13  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Boolean notifyHouseStateOccupationInAction(List<Long> houseIds);

	/**
	 *
	 * 功能描述: 根据楼栋id查询在这个楼栋下的不同状态的房间的数量VO列表，全部用"000"表示
	 *
	 * @author 付湘辉
	 * Created on:2008-7-3
	 *
	 * 修改原因：
	 * @param buildingId
	 * @return List<HouseStatusVO> 返回结果
	 */
	public List<HouseStatusVO> queryDifferentStatusHouseStatusListBybuildingId(Long buildingId);

	/**
	 *
	 * 功能描述: 根据房屋搜索VO条件，查询楼栋下房屋列表分页信息<br>
	 * 此方法返回一个<b>Map<Integer, Object></b> <br>
	 * 里面第一个键值对是整个楼栋里房间最多的楼层的房间数量,用Integer存储 <br>
	 * 第二个键值对是楼栋下房屋分页列表信息，用List<FloorVO>存储 <br>
	 * 第三个键值对是楼栋下房间总数,用Integer存储<br>
	 *
	 * @author 付湘辉 <br>
	 * Created on:2008-7-2 <br>
	 *
	 * 修改原因： <br>
	 * @param searchVO <br>
	 * @param currentPage <br>
	 * @param pageSize <br>
	 * @return Map<Integer, Object> <br>
	 */
	public Map<Integer, Object> queryHouseIconListByPage(HouseSearchVO searchVO,Integer currentPage,Integer pageSize);

    /**
	 * 功能描述:通过一个房间ID，查询一个房间ID列表，如果这个指定的房间是管理房，
	 * 得到它的产权房ID列表，否则返回的列表中只有它本身的ID  <br>
	 * @param houseId  一个拥用有效账户的房间ID
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-12-24  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public List<Long> queryHouseIdListById(Long houseId);
	
	/**
	 * 功能描述:通过一个房间ID，查询一个房间ID列表，如果这个指定的房间是管理房，
	 * 得到它的产权房ID列表，如果它是产权房，同时又在一个管理房下，则也查出所有相关的产权房ID和它本身，
	 * 当它是一个独立的产权房时，在返回的列表只包含它本身  <br>
	 * @param houseId 房间ID
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-12-24  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public List<Long> queryAllHouseIdListById(Long houseId);

   /**
	 *
	 * 功能描述: 根据房屋搜索VO条件，查询指定楼栋和单元下房屋列表信息
	 * @author 付湘辉
	 * Created on:2008-7-2
	 *
	 * 修改原因：
	 * @param searchVO
	 * @return List<FlatVO> 返回结果
	 */
	public List<FlatVO> queryHouseListBy(HouseSearchVO searchVO);

   /**
	*
	* 功能描述: 根据房屋搜索VO条件，查询楼栋下房屋列表分页信息。 <br>
	* <ul>
	* <li>此方法调用{@link com.ce.pms.house.dao.impl.HouseDaoImpl#queryPagedHouses(HouseSearchVO, Integer, Integer)}方法，
	*  在得到的Page结果中是Object[]列表，为便于Action使用，使用FlatVO重新封装</li>
	* </ul>
	*
	* @param searchVO
	* @param currentPage
	* @param pageSize
	* @return Page
	*
	* Create author:付湘辉  <br>
	* Create on:2008-7-2  <br>
	* Edit author:  <br>
	* Edit on:    <br>
	* Why:     <br>
	*/
	public Page queryHouseListByPage(HouseSearchVO searchVO,Integer currentPage,Integer pageSize);

	/**
	 * 功能描述: 查找指定产权房的下一间产权房，以所在楼栋，单元(如果有)，楼层，房号为排序规则 <br>
	 * @param houseId
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-10-17  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public HouseVO queryNextHouseById(Long houseId);

	boolean checkIsOnlyHouseNoInHouseAndCoalitionHouse(String houseNumber , Long houseId);
}
